<?php


################################################################################################
##--> CLASS: gmap
################################################################################################
#-> Description:
#>		A simple class to get some route-informations from google maps:
#>
#>		Public Methods:
#>			070	- Constructor		(gmap)
#>			100	- Distance			(getDis, getDistance)
#>			132	- Coordinates		(getCoords, GetCoordinates)
#>			193	- Locations			(getLoca, getLocations)
#>			225	- Accuracy			(getAcc, getAccuracy)
#>
#>		Public Variables:
#>			032	- Accuracy			($accuracy)
#>			032	- Coordinates		($coordinates)
#>			032	- Location			($location)
#>			032	- Distance			($distance)
#>
#-> Useage:
#>		$gmap = new $gmap([int $latitude, [int $longitude]]);
################################################################################################


class gmap {
	################################################################################################
	##--> VARIABLES
	################################################################################################
	#-> Public
	public $accuracy = NULL;
	public $coordinates = NULL;
	public $location = NULL;
	public $distance = NULL;

	#-> Private
	#> gmap()
	private $gmap_one;
	private $gmap_two;

	#> getDis
	private $getDis_start;
	private $getDis_end;
	private $getDis_data;
	private $getDis_matches;

	#> getCoords
	private $user_address;
	private $getCoords_url;
	private $getCoords_data;
	private $getCoords_result;
	private $getCoords_return;

	#> getLoca
	private $user_latitude;
	private $user_longitude;
	private $getLoca_url;
	private $getLoca_data;
	private $getLoca_result;

	#> getAcc
	private $user_accuracy;
	private $getAcc_result;



	################################################################################################
	##--> CONSTRUCTOR: gmap()
	################################################################################################
	public function gmap ($gmap_one = FALSE, $gmap_two = FALSE) {

		#-> Set Accuracy
		if (is_int($gmap_one) && $gmap_two === FALSE) {
			$accuracy = $this->getAccu($gmap_one);
		}
		#-> Set Coordinates
		elseif (is_string($gmap_one) && $gmap_two === FALSE) {
			$coordinates = $this->getCoords($gmap_one, $gmap_tw0);
		}
		#-> Set Location
		elseif (is_int($gmap_one) && is_int($gmap_two)) {
			$location = $this->getLoca($gmap_one, $gmap_two);
		}
		#-> Set Distance
		elseif (isset($gmap_one) && isset($gmap_two)) {
			$distance = $this->getDis($gmap_one, $gmap_two);
		}
	}


	################################################################################################
	##--> PUBLIC METHOD: getDis
	################################################################################################
	#-> Description:
	#>		Load Distance between two Addresses
	#>
	#-> Useage:
	#>		getDis(string $address1, string $address2);
	#>
	#-> Return:
	#>		variable:
	#>			int		Distance in Meters
	#>
	#-> Error-Return:
	#>		variable:
	#>			int		-1
	################################################################################################
	public function getDis ($getDis_start, $getDis_end) {
		$getDis_start = trim($getDis_start);
		$getDis_end = trim($getDis_end);

		$getDis_start = str_replace(" ", "+", $getDis_start);
		$getDis_end = str_replace(" ", "+", $getDis_end);

		$getDis_data = @file_get_contents("http://maps.google.com/maps/nav?q=".$getDis_start."%20to:".$getDis_end);

		if (preg_match_all('/(Distance)(":\\{")(meters)(")(:)(\\d+)(,)/is', $getDis_data, $getDis_matches)) {
			return $getDis_matches[6][0];
		}
		else {
			return -1;
		}
	}


	################################################################################################
	##--> PUBLIC METHOD: getCoords
	################################################################################################
	#-> Description:
	#>		Load Coordinates from a Address
	#>
	#-> Useage:
	#>		getCoords(string $address);
	#>
	#-> Return:
	#>		array:
	#>			0			=>	float	Latitude
	#>			1			=>	float	Longitude
	#>			2			=>	int		Accuracy
	#>			latitude	=>	float	Latitude
	#>			longitude	=>	float	Longitude
	#>			accuracy	=>	int		Accuracy
	#>
	#-> Error-Return:
	#>		variable:
	#>			bool	FALSE
	################################################################################################
	public function getCoords ($user_address) {
		$user_address = trim($user_address);
		$user_address = str_replace(" ", "+", $user_address);

		$getCoords_url = "http://maps.google.com/maps/geo?output=csv&sensor=false&q=".$user_address;

		#-> Non-JSON-Method
		$getCoords_data = @file_get_contents($getCoords_url);
		$getCoords_result = explode(",", $getCoords_data);

		if ($getCoords_result[0] == 200) {
			$getCoords_return[0] = $getCoords_result[2];
			$getCoords_return["latitude"] = $getCoords_result[2];

			$getCoords_return[1] = $getCoords_result[3];
			$getCoords_return["longitude"] = $getCoords_result[3];

			$getCoords_return[2] = $getCoords_result[1];
			$getCoords_return["accuracy"] = $getCoords_result[1];

			return $getCoords_return;
		} else {
			return FALSE;
		}

		#-> JSON Method
#		$getCoords_data = @file_get_contents($getCoords_url);
#		$getCoords_result = json_decode($getCoords_data);
#
#		if ($getCoords_result->Status->code == 200) {
#			$getCoords_return[0] = $getCoords_result->Placemark[0]->Point->coordinates[0];
#			$getCoords_return["latitude"] = $getCoords_result->Placemark[0]->Point->coordinates[0];
#
#			$getCoords_return[1] = $getCoords_result->Placemark[0]->Point->coordinates[1];
#			$getCoords_return["longitude"] = $getCoords_result->Placemark[0]->Point->coordinates[1];
#
#			$getCoords_return[2] = $getCoords_result->Placemark[0]->AddressDetails->Accuracy;
#			$getCoords_return["accuracy"] = $getCoords_result->Placemark[0]->AddressDetails->Accuracy;
#		}
	}


	################################################################################################
	##--> PUBLIC METHOD: getLoca
	################################################################################################
	#-> Description:
	#>		Load Location from Coordinates
	#>
	#-> Useage:
	#>		getLoca(int/string $latitude, int/string $longitude);
	#>
	#-> Return:
	#>		variable:
	#>			string	Location
	#>
	#-> Error-Return:
	#>		variable:
	#>			bool	FALSE
	################################################################################################
	public function getLoca ($user_latitude, $user_longitude) {
		$getLoca_url = "http://maps.google.com/maps/geo?output=csv&sensor=false&q=".$user_latitude.",".$user_longitude;
		$getLoca_data = @file_get_contents($getLoca_url);

		if (preg_match_all('/.*?(".*?")/is', $getLoca_data, $getLoca_matches) !== FALSE) {
			$getLoca_result = substr($getLoca_matches[1][0], 1, -1);

			return $getLoca_result;
		}
		else {
			return FALSE;
		}
	}


	################################################################################################
	##--> PUBLIC METHOD: getAcc
	################################################################################################
	#-> Description:
	#>		Convert Accuracy-Number in a discriptionable string.
	#>
	#-> Useage:
	#>		getAcc(int $accuracy);
	#>
	#-> Return:
	#>		variable:
	#>			string	Accuracy
	#>
	#-> Error-Return:
	#>		variable:
	#>			bool	FALSE
	################################################################################################
	public function getAcc ($user_accuracy) {
		switch ($user_accuracy) {
			case 0:
				$getAcc_result = "continent";
				break;
			case 1:
				$getAcc_result = "state";
				break;
			case 2:
				$getAcc_result = FALSE;
				break;
			case 3:
				$getAcc_result = FALSE;
				break;
			case 4:
				$getAcc_result = "city";
				break;
			case 5:
				$getAcc_result = FALSE;
				break;
			case 6:
				$getAcc_result = "street";
				break;
			case 7:
				$getAcc_result = FALSE;
				break;
			case 8:
				$getAcc_result = "address";
				break;
			default:
				$getAcc_result = FALSE;
		}

		return $getAcc_result;
	}


	################################################################################################
	##--> ALIASES
	################################################################################################
	#-> Distance
	public function getDistance ($getDis_start, $getDis_end) {
		return $this->getCoords($getDis_start, $getDis_end);
	}

	#-> Coordinates
	public function getCoordinates ($user_address) {
		return $this->getCoords($user_address);
	}

	#-> Location
	public function getLocation ($user_latitude, $user_longitude) {
		return $this->getLoca($user_latitude, $user_longitude);
	}

	#-> Accuracy
	public function getAccu ($user_accuracy) {
		return $this->getAcc($user_accuracy);
	}

	public function getAccuracy ($user_accuracy) {
		return $this->getAcc($user_accuracy);
	}
}


?>